/*
 * @Author: complex 1944755442@qq.com
 * @Date: 2024-01-24 16:33:00
 * @LastEditors: complex 1944755442@qq.com
 * @LastEditTime: 2024-01-24 18:12:28
 * @FilePath: /prjs/my-linux-snake/debugLog.h
 * @Description: 输出调试信息：可向屏幕输出，也可以向文件输出。
 */
#ifndef _DEBUG_LOG
#define _DEBUG_LOG      

#include <stdarg.h>
#include <time.h>
#include <stdlib.h>
#define FILE_DEBUG_MODE

//我想让输出流在 stderr 和文件流之间转换。但是文件流的话，必须首先打开文件才行，
//现在的矛盾是：宏定义定义一个和stderr类似的宏(LOG_FP)
//漏洞：假如用户并没有打开文件log.txt,那么直接运行宏，会发生严重的错误
//另外:我本来想要添加时间，但是遇到了error: lvalue required as unary ‘&’ operand错误
#define DEBUG_FILE "./log.txt"

#ifdef FILE_DEBUG_MODE 


void debug_timestamp();

#define DEBUG_PRINTF(fmt,arg...)   {\
                                        if(log_fp == NULL) \
                                        {   perror("Please init log file first"); exit(-1);}\
                                        else\
                                        {\
                                            debug_timestamp();\
                                            fprintf(log_fp, "<Position> %s:line%d\n", __FILE__, __LINE__);\
                                            fprintf(log_fp,"<Debug Info>: "fmt"\n\n",##arg); \
                                        }\
                                    }
#else
#define DEBUG_PRINTF(fmt,arg...)   {\
                                    debug_timestamp();\
                                    fprintf(stderr, "<Position> %s:line%d\n", __FILE__, __LINE__);\
                                    fprintf(stderr,"<Debug Content>: "fmt"\n",##arg); \
                                    }
#endif

//void debug_test();
void debug_timestamp();
void debug_file_init();

int FILE_DEBUG_PRINTF(const char*format, ...);
#endif /*_DEBUG_LOG*/